package com.hsh.erp.domain.vo;

import com.hsh.erp.domain.dto.ProductDTO;
import com.hsh.erp.utils.DateUtils;
import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.logging.log4j.util.Strings;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @GetMapping("/list") order
 */
@Data
@Accessors(chain = true)
public class OrderVO implements Serializable {
    /**
     *
     */
    private Integer id;

    /**
     * 店铺id
     */
    private Integer shopId;

    /**
     * 订单状态
     */
    private String orderState;

    /**
     * 线上订单号（同1个店铺id对应n个商品，线上订单号已存在时,无法导入，只能手动新增，收件人地址需要去除特殊符号）
     */
    private String no;

    /**
     * 合并订单号，多个订单号用“,”区分
     */
    private String mergeNo;

    /**
     * 商品id
     */
    private Integer productId;

    /**
     * 商品名称
     */
    private String productName;

    /**
     * 仓库id
     */
    private Integer repositoryId;

    /**
     * 订单总重量
     */
    private Integer weightGram;

    /**
     * 订单数量：散装库存
     */
    private Integer planNum;

    /**
     * 实际数量：散装库存
     */
    private Integer actualNum;

    /**
     * 0-未完成 1 -已完成 （同一个订单号，所有商品的订单数量=所有订单的所有实际入库数量，才可以设置为已完成）
     */
    private Integer isFinish;

    /**
     * 收件人姓名
     */
    private String customerName;

    /**
     * 收件人地址
     */
    private String customerAddress;

    /**
     * 收件人电话
     */
    private String customerPhone;

    /**
     * 付款时间
     */
    private LocalDateTime payTime;

    /**
     * 打印时间
     */
    private LocalDateTime printTime;

    /**
     * 快递单号
     */
    private String expressNum;

    /**
     * 快递id
     */
    private Integer expressId;

    /**
     * 订单导入时间
     */
    private LocalDateTime createTime;

    /**
     * 备注
     */
    private String note;

    /**
     * 是否删除 0-未删除 1-已删除
     */
    private Integer isDelete;

    /**
     * 出入库no
     */
    private String inOutNo;

    /**
     * 开始时间
     */
    private String startTime;

    /**
     * 结束时间
     */
    private String endTime;

    /**
     * sku码
     */
    private String skuNo;

    /**
     * 重量 :kg
     */
    private BigDecimal weightKg;
    /**
     * 商品信息 *
     */
    private String productInfo;

    /**
     * 商品列表
     */
    private List<ProductDTO> productDTOList;


    /**
     * 订单已存在时，是否强制合并，
     * 0-不强制合并（默认） -> 返回重复导入
     * 1-强制合并 -> 合并订单，数量叠加
     */
    private Integer isForcedMerger;

    /**
     * no+productId+repositoryId 重复时，数量是否需要叠加
     * 0-不叠加（默认） 1-叠加
     */
    private Integer isAddNum;

    /**
     * 初始化重量，单位转化
     *
     * @return
     */
    public OrderVO init() {
        this.weightGram = this.weightGram == null ? 0 : this.weightGram;
        this.weightKg = BigDecimal.valueOf(this.weightGram, 3);
        return this;
    }

    /**
     * 添加时初始化参数
     *
     * @return
     */
    public OrderVO addInit() {
        this.no = Strings.isBlank(this.no) ? DateUtils.getNowStr() : this.no;
        this.mergeNo = Strings.isBlank(this.mergeNo) ? this.no : this.mergeNo;

        this.planNum = this.planNum == null ? 0 : this.planNum;
        this.actualNum = this.actualNum == null ? this.planNum : this.actualNum;
        this.isFinish = this.planNum > this.actualNum ? 0 : 1;

        this.isForcedMerger = this.isForcedMerger == null ? 0 : this.isForcedMerger;
        this.isAddNum = this.isAddNum == null ? 0 : this.isAddNum;
        this.isDelete = this.isDelete == null ? 0 : this.isDelete;

        this.createTime = this.createTime == null ? LocalDateTime.now() : this.createTime;
        return this;
    }

    /**
     * 修改时初始化
     *
     * @return
     */
    public OrderVO updateInit() {
        if (this.planNum != null && this.actualNum != null) {
            this.isFinish = this.planNum > this.actualNum ? 0 : 1;
        }
        return this;
    }
}